/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mrp.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import mrp.entity.GestorBaseDatos;
import mrp.entity.Proveedor;
import mrp.login.Login;
import mrp.web.ProveedorWeb;

/**
 *
 * @author root
 */
@ManagedBean(name="proveedor")
@SessionScoped
public class ProveedorBean implements Serializable{
    
    @ManagedProperty("#{usuarioBean}")
    private UsuarioBean usuarioBean;
    @ManagedProperty("#{login}")
    private Login login;
    @ManagedProperty("#{proveedorweb}")
    private ProveedorWeb proveedorweb;
    
    private Proveedor proveedor;
    
    
     //-----------atributos Proveedor--------------------------
    
    //-----------fin atributos Proveedor--------------------------
    
    //---------------------metodos getters and setters-----------------------
    public Login getLogin() {
        return login;
    }
    public void setLogin(Login login) {
        this.login = login;
    }
    public Proveedor getProveedor() {
        return proveedor;
    }
    public void setProveedor(Proveedor proveedor) {
        this.proveedor = proveedor;
    }
    public ProveedorWeb getProveedorweb() {
        return proveedorweb;
    }
    public void setProveedorweb(ProveedorWeb proveedorweb) {
        this.proveedorweb = proveedorweb;
    }
    public UsuarioBean getUsuarioBean() {
        return usuarioBean;
    }
    public void setUsuarioBean(UsuarioBean usuarioBean) {
        this.usuarioBean = usuarioBean;
    }
    
    
    
    public String getDigitador() {
        return this.getProveedor().getDigitador();
    }

    public void setDigitador(String digitador) {
        this.getProveedor().setDigitador(digitador);
    }

    public String getDireccion() {
        return this.getProveedor().getDireccion();
    }

    public void setDireccion(String direccion) {
        this.getProveedor().setDireccion(direccion);
    }

    public String getFechaDigitador() {
        return  this.getProveedor().getFechaDigitador();
    }

    public void setFechaDigitador(String fechaDigitador) {
        this.getProveedor().setFechaDigitador(fechaDigitador);
    }

    public String getNombreProveedor() {
        return  this.getProveedor().getNombreProveedor();
    }

    public void setNombreProveedor(String nombreProveedor) {
         this.getProveedor().setNombreProveedor(nombreProveedor);
    }

    public String getNumeroCedulaRUC() {
        return  this.getProveedor().getNumeroCedulaRUC();
    }

    public void setNumeroCedulaRUC(String numeroCedulaRUC) {
         this.getProveedor().setNumeroCedulaRUC(numeroCedulaRUC);
    }

    public String getNumeroProveedor() {
        return  this.getProveedor().getNumeroProveedor();
    }

    public void setNumeroProveedor(String numeroProveedor) {
        this.getProveedor().setNumeroProveedor(numeroProveedor);
    }

    public String getTelefono() {
        return this.getProveedor().getTelefono();
    }
    public void setTelefono(String telefono) {
        this.getProveedor().setTelefono(telefono);
    }

    public String getTelefonoCelular() {
        return this.getProveedor().getTelefonoCelular();
    }

    public void setTelefonoCelular(String telefonoCelular) {
        this.getProveedor().setTelefonoCelular(telefonoCelular);
    }    
       
    
    //-----------------fin metodos getters and setters-----------------------
    
    //-----------------metodos de la clase Proveedor--------------------------
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
    public void mostrarMensaje(String tipoMensaje,String mensaje, String detalle)
    {
        if(tipoMensaje.equals("info"))
        {
            FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje,detalle) );   
        }else{
            if(tipoMensaje.equals("error"))
            {
                FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, mensaje,detalle) );   
            }else{
                if(tipoMensaje.equals("fatal"))
                {
                    FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_FATAL, mensaje,detalle) );   
                }else{
                    if(tipoMensaje.equals("alerta"))
                    {
                        FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_WARN, mensaje,detalle) );   
                    }
                }
            }
        }
    }
    
    private boolean verificarLogin()
    {
        if(login.verificarSesionUsuario().equals(usuarioBean.getUsuario().getIdSesion()))
        {           
            return true;
        }
        else
        {
            this.mostrarMensaje("error","No está ingresado al sistema","");
            this.borrarDatos();
        }
        return false;
    }
    private void setearConexion(GestorBaseDatos gbd)
    {
        gbd.setUsuario(usuarioBean.getUsuario().getCedulaUsuario());
        gbd.setClave(usuarioBean.getUsuario().getClave());
        gbd.setBasedatos("BDEgoZapateria");
        gbd.setPuerto("5432");
        gbd.setServidor("localhost");
    }
    private void borrarDatos()
    {
        this.setDigitador(null);
        this.setDireccion(null);
        this.setFechaDigitador(null);
        this.setNumeroProveedor(null);
        this.setNombreProveedor(null);
        this.setNumeroCedulaRUC(null);        
        this.setTelefono(null);
        this.setTelefonoCelular(null);
    }    
    public boolean validarCedula(String cedula)
    {
        return true;
    }
    public boolean validarRUC(String ruc)
    {
        return true;
    }
    public boolean ingresarProveedor()
    {
        boolean cedulaRUCValida;
        if(this.getNumeroCedulaRUC().length()==10){
            cedulaRUCValida=this.validarCedula(this.getNumeroCedulaRUC());
        }
        else if(this.getNumeroCedulaRUC().length()==13){
            cedulaRUCValida=this.validarRUC(this.getNumeroCedulaRUC());
        }
        else
        {
            this.mostrarMensaje("error","El numero de cedula o RUC es incorrecto", "cedula o RUC es incorrecto");
            cedulaRUCValida=false;
        }        
        if(this.verificarLogin()&&cedulaRUCValida)
        {
            boolean noExiste;
            
            GestorBaseDatos gbd=new GestorBaseDatos();
            this.setearConexion(gbd);
            
            //obtener fecha y hora del servidor
            List fechaList=gbd.select("SELECT TIMESTAMP WITHOUT TIME ZONE \'now\'");
            String fechaHora=(fechaList.get(0).toString());                      
            
            noExiste=(gbd.select("select NumeroCedulaRUC from proveedor where proveedor.NumeroCedulaRUC = \'"+this.getNumeroCedulaRUC()+"\'")).isEmpty(); 
            
            if(noExiste)
            {
                List <String> datosLista= new ArrayList<String>();
                String respuestaInsert; //es la respuesta del insert si se almaceno o no los datos

                //Generacion del primary key
                this.setNumeroProveedor(gbd.generaCodigo("proveedor", "PR"));
                datosLista.add(0,"\'"+this.getNumeroProveedor()+"\'");

                datosLista.add(1,"\'"+this.getNumeroCedulaRUC()+"\'");                
                datosLista.add(2,"\'"+this.getNombreProveedor()+"\'");
                datosLista.add(3,"\'"+this.getDireccion()+"\'");
                datosLista.add(4,"\'"+this.getTelefono()+"\'");
                datosLista.add(5,"\'"+this.getTelefonoCelular()+"\'");
                datosLista.add(6,this.usuarioBean.getUsuario().getCodUsuario());

                datosLista.add(7,"\'"+fechaHora+"\'");

                //Almacenar datos en la tabla Vendedor
                respuestaInsert=""+gbd.insert("Proveedor",datosLista,true);
           
                if(respuestaInsert.equals("Registro almacenado correctamente"))
                {
                        mostrarMensaje("info","Ingresado Nuevo Proveedor!","");
                        this.borrarDatos();
                        return true;
                }
                else
                {
                    mostrarMensaje("fatal","Error al almacenar los datos","");
                }
                    //System.out.println("personaEmpresa------ ´´´´= "+personaEmpresa);
            }
            else
            {
                this.mostrarMensaje("error","Error: El Proveedor que desea ingresar ya existe","");
                this.borrarDatos();     
                return true;
            }
           
        }
        return false;
    }
    public List<List> consultarProveedor(String consultar, String criterioConsulta,String coincidencia)
    {   
        List<List>listaRetorno=new ArrayList<List>();
        List<Proveedor>listaProveedor=new ArrayList<Proveedor>();

        GestorBaseDatos gbd=new GestorBaseDatos();
        this.setearConexion(gbd);
        String query="select * ";       
        String from=" from Proveedor as p";
        String where=" where ";
        String and=" and ";
        String like=" ilike \'%"+consultar+"%\'";
        
        if(coincidencia.equals("exacta"))
        {like=" ilike \'"+consultar+"\'";}
        else{
        if(coincidencia.equals("inicial"))
        {like=" ilike \'"+consultar+"%\'";}
        else{ if(coincidencia.equals("final"))
        {like=" ilike \'%"+consultar+"\'";}}
        }
        
        where+="p."+criterioConsulta;
        and="";
        List<List>lista=gbd.selectVarios(query+from+where+and+like);
        for(int j=0;j<lista.size();j++)
        {
            listaProveedor.add(new Proveedor(((lista.get(j)).get(0)).toString(), ((lista.get(j)).get(1)).toString(), ((lista.get(j)).get(2)).toString(), ((lista.get(j)).get(3)).toString(), ((lista.get(j)).get(4)).toString(), ((lista.get(j)).get(5)).toString()));               
        }           
       
       System.out.println("Proveedor cliente el valor del textBuscarProveedor es"+query+from+where+and+like); 
                
        listaRetorno.add(listaProveedor);

        System.out.println("Clase Proveedor el valor del textBuscarProveedor es"+query+" "+from+" "+where+" "+and+" "+like);
        System.out.println("listaProveedor "+listaProveedor.size()+ " listaRetorno "+listaRetorno.size());
        return listaRetorno;
    }
    public boolean modificarDatosProveedor()
    {
        boolean cedulaRUCValida;
        if(this.getNumeroCedulaRUC().length()==10){
            cedulaRUCValida=this.validarCedula(this.getNumeroCedulaRUC());
        }
        else if(this.getNumeroCedulaRUC().length()==13){
            cedulaRUCValida=this.validarRUC(this.getNumeroCedulaRUC());
        }
        else
        {
            this.mostrarMensaje("error","El numero de cedula o RUC es incorrecto", "cedula o RUC es incorrecto");
            cedulaRUCValida=false;
        }  
        if(this.verificarLogin()&&cedulaRUCValida)
        {
            boolean noExiste;
            
            GestorBaseDatos gbd=new GestorBaseDatos();
            this.setearConexion(gbd);
            
            //Verifica que la fecha no sea mayor a la actual
             //obtener fecha y hora del servidor
            List fechaList=gbd.select("SELECT TIMESTAMP WITHOUT TIME ZONE \'now\'");
            String fechaHora=(fechaList.get(0).toString()).substring(0,19);
            
            noExiste=(gbd.select("select NumeroCedulaRUC from Proveedor where NumeroCedulaRUC = \'"+this.getNumeroCedulaRUC()+"\'")).isEmpty();
            
            if(noExiste==false)
            {
                List <String> datosLista= new ArrayList<String>();
                String respuestaUpdate; //es la respuesta del update si se almaceno o no los datos

                datosLista.add(0,"\'"+this.getNumeroProveedor()+"\'");

                datosLista.add(1,"\'"+this.getNumeroCedulaRUC()+"\'");         
                datosLista.add(2,"\'"+this.getNombreProveedor()+"\'");
                datosLista.add(3,"\'"+this.getDireccion()+"\'");
                datosLista.add(4,"\'"+this.getTelefono()+"\'");
                datosLista.add(5,"\'"+this.getTelefonoCelular()+"\'");

                datosLista.add(6,this.usuarioBean.getUsuario().getCodUsuario());

                datosLista.add(7,"\'"+fechaHora+"\'");

                String condicion="NumeroProveedor=\'"+this.getNumeroProveedor()+"\'";

                //Almacenar datos en la tabla cliente
                respuestaUpdate=""+gbd.update("Proveedor",datosLista,condicion,true);

                //datosLista.add(,this);
                             
                if(respuestaUpdate.equals("Registro actualizado correctamente"))
                {
                        mostrarMensaje("info","Actualizado Datos del Proveedor!","");
                        this.borrarDatos(); //aqui debe retornar a la pagina de consulta de clientes
                        return true;
                }
                else
                {
                    mostrarMensaje("fatal","Error al actualizar los datos","");//aqui debe retornar a la pagina de consulta de clientes
                }
                    //System.out.println("personaEmpresa------ ´´´´= "+personaEmpresa);
            }
            else
            {
                this.mostrarMensaje("error","Error: El proveedor que desea actualizar NO existe en el sistema","");
                this.borrarDatos();   //aqui debe retornar a la pagina de ingreso de clientes  
                return true;
            }            
        }
        return true;
    }
    public boolean eliminarProveedor(String numeroProveedor)
    {        
        if(this.verificarLogin())
        {
            int enSistema=-1;
            GestorBaseDatos gbd=new GestorBaseDatos();
            this.setearConexion(gbd);
            //verificar que el proveedor a eliminar no tenga entregas registradas ni solicitadas
            enSistema=Integer.parseInt((gbd.select("select count(NumeroOrdenAprovisionamiento) from OrdenAprovisionamiento where  Proveedor_fk= \'"+numeroProveedor+"\'")).get(0).toString()); 
            if(enSistema==0)            
            {
               if(gbd.delete("Proveedor","numeroProveedor", "\'"+numeroProveedor+"\'",true)) return true;               
            }
            else
            {
                this.mostrarMensaje("error","Error: El proveedor que desea eliminar está registrado en una o varias ordenes de aprovisionamiento.","");
            }
        }
        return false;
    }
}
